/// @file version.c
///
/// Nvim was forked from Vim 7.4.160.
/// Vim originated from Stevie version 3.6 (Fish disk 217) by GRWalter (Fred).

#include <inttypes.h>
#include <assert.h>
#include <limits.h>

#include "nvim/vim.h"
#include "nvim/ascii.h"
#include "nvim/iconv.h"
#include "nvim/version.h"
#include "nvim/charset.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
#include "nvim/message.h"
#include "nvim/misc2.h"
#include "nvim/screen.h"
#include "nvim/strings.h"

// version info generated by the build system
#include "auto/versiondef.h"

#define STR_(x) #x
#define STR(x) STR_(x)

// for ":version", ":intro", and "nvim --version"
#ifndef NVIM_VERSION_MEDIUM
#define NVIM_VERSION_MEDIUM STR(NVIM_VERSION_MAJOR) "." STR(NVIM_VERSION_MINOR)\
  "." STR(NVIM_VERSION_PATCH) NVIM_VERSION_PRERELEASE
#endif
#define NVIM_VERSION_LONG "NVIM " NVIM_VERSION_MEDIUM


char *Version = VIM_VERSION_SHORT;
char *longVersion = NVIM_VERSION_LONG;
char *version_buildtype = "Build type: " NVIM_VERSION_BUILD_TYPE;
char *version_cflags = "Compilation: " NVIM_VERSION_CFLAGS;

#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "version.c.generated.h"
#endif

static char *features[] = {
#ifdef HAVE_ACL
  "+acl",
#else
  "-acl",
#endif

#if (defined(HAVE_ICONV_H) && defined(USE_ICONV)) || defined(DYNAMIC_ICONV)
# ifdef DYNAMIC_ICONV
  "+iconv/dyn",
# else
  "+iconv",
# endif
#else
  "-iconv",
#endif

#ifdef HAVE_JEMALLOC
  "+jemalloc",
#else
  "-jemalloc",
#endif

#ifdef FEAT_TUI
  "+tui",
#else
  "-tui",
#endif
  NULL
};

// clang-format off
static int included_patches[] = {
  2219,
  // 2200,
  // 2199,
  // 2198,
  // 2197,
  // 2196,
  // 2195,
  // 2194,
  // 2193,
  // 2192,
  // 2191,
  // 2190,
  // 2189,
  // 2188,
  // 2187,
  // 2186,
  // 2185,
  // 2184,
  // 2183,
  // 2182,
  // 2181,
  // 2180,
  // 2179,
  // 2178,
  // 2177,
  // 2176,
  // 2175,
  // 2174,
  // 2173,
  // 2172,
  // 2171,
  // 2170,
  // 2169,
  // 2168,
  // 2167,
  // 2166,
  // 2165,
  // 2164,
  // 2163,
  // 2162,
  // 2161,
  // 2160,
  // 2159,
  // 2158,
  // 2157,
  // 2156,
  // 2155,
  // 2154,
  // 2153,
  // 2152,
  // 2151,
  // 2150,
  // 2149,
  // 2148,
  // 2147,
  // 2146,
  // 2145,
  // 2144,
  // 2143,
  // 2142,
  // 2141,
  // 2140,
  // 2139,
  // 2138,
  // 2137,
  // 2136,
  // 2135,
  // 2134,
  // 2133,
  // 2132,
  // 2131,
  // 2130,
  // 2129,
  // 2128,
  // 2127,
  // 2126,
  // 2125,
  // 2124,
  // 2123,
  // 2122,
  // 2121,
  // 2120,
  // 2119,
  // 2118,
  // 2117,
  // 2116,
  // 2115,
  // 2114,
  // 2113,
  2112,
  // 2111,
  // 2110,
  // 2109,
  // 2108,
  // 2107,
  // 2106,
  // 2105 NA
  // 2104,
  // 2103,
  // 2102 NA
  // 2101,
  // 2100,
  // 2099,
  // 2098,
  // 2097,
  // 2096,
  // 2095,
  // 2094,
  // 2093,
  // 2092 NA
  // 2091 NA
  // 2090,
  // 2089 NA
  // 2088,
  // 2087,
  // 2086,
  // 2085,
  // 2084,
  // 2083,
  // 2082,
  // 2081,
  // 2080,
  // 2079 NA
  // 2078 NA
  // 2077,
  // 2076,
  // 2075,
  // 2074,
  // 2073,
  // 2072,
  // 2071,
  // 2070 NA
  // 2069,
  // 2068,
  // 2067,
  2066,
  // 2065,
  // 2064,
  // 2063 NA
  // 2062,
  // 2061,
  // 2060 NA
  // 2059 NA
  // 2058,
  // 2057 NA
  // 2056 NA
  // 2055 NA
  // 2054 NA
  // 2053 NA
  // 2052 NA
  // 2051,
  // 2050,
  // 2049,
  // 2048 NA
  // 2047,
  // 2046,
  // 2045 NA
  // 2044,
  // 2043,
  // 2042 NA
  // 2041 NA
  // 2040 NA
  // 2039 NA
  // 2038 NA
  // 2037 NA
  // 2036,
  // 2035 NA
  // 2034 NA
  // 2033,
  // 2032 NA
  // 2031,
  // 2030 NA
  // 2029,
  // 2028,
  // 2027 NA
  // 2026 NA
  // 2025 NA
  // 2024,
  // 2023,
  // 2022,
  // 2021,
  // 2020 NA
  // 2019,
  // 2018,
  // 2017,
  // 2016 NA
  // 2015,
  2014,
  2013,
  2012,
  2011,
  // 2010,
  // 2009,
  // 2008,
  // 2007,
  // 2006,
  // 2005,
  // 2004 NA
  // 2003 NA
  // 2002,
  // 2001 NA
  // 2000,
  // 1999,
  // 1998 NA
  // 1997,
  // 1996,
  // 1995 NA
  // 1994,
  // 1993,
  // 1992,
  // 1991,
  // 1990,
  // 1989,
  // 1988 NA
  // 1987 NA
  // 1986,
  // 1985 NA
  // 1984,
  // 1983 NA
  // 1982 NA
  // 1981,
  // 1980,
  // 1979,
  // 1978,
  // 1977,
  // 1976,
  // 1975,
  // 1974 NA
  1973,
  // 1972,
  // 1971,
  // 1970,
  // 1969 NA
  // 1968,
  // 1967,
  // 1966,
  // 1965 NA
  // 1964,
  // 1963 NA
  // 1962,
  // 1961,
  1960,
  // 1959 NA
  // 1958 NA
  // 1957 NA
  // 1956,
  // 1955,
  // 1954,
  // 1953,
  // 1952,
  // 1951 NA
  // 1950,
  // 1949,
  // 1948,
  // 1947 NA
  // 1946 NA
  // 1945,
  // 1944 NA
  // 1943 NA
  // 1942 NA
  // 1941,
  // 1940,
  // 1939 NA
  // 1938 NA
  // 1937,
  // 1936,
  // 1935 NA
  // 1934 NA
  // 1933 NA
  // 1932 NA
  // 1931 NA
  // 1930 NA
  // 1929 NA
  // 1928,
  // 1927 NA
  // 1926 NA
  // 1925 NA
  // 1924 NA
  // 1923,
  // 1922 NA
  // 1921 NA
  // 1920 NA
  // 1919 NA
  // 1918 NA
  // 1917 NA
  // 1916 NA
  // 1915 NA
  // 1914,
  // 1913,
  // 1912,
  // 1911,
  // 1910,
  // 1909,
  // 1908 NA
  // 1907,
  // 1906 NA
  // 1905,
  // 1904,
  // 1903,
  // 1902 NA
  // 1901 NA
  // 1900,
  // 1899 NA
  1898,
  // 1897,
  // 1896,
  // 1895,
  // 1894 NA
  // 1893,
  // 1892 NA
  // 1891 NA
  // 1890 NA
  // 1889,
  // 1888,
  // 1887 NA
  // 1886 NA
  // 1885 NA
  // 1884,
  // 1883 NA
  // 1882,
  // 1881,
  // 1880 NA
  // 1879 NA
  // 1878 NA
  // 1877 NA
  // 1876,
  // 1875,
  // 1874 NA
  // 1873 NA
  // 1872 NA
  // 1871,
  // 1870 NA
  // 1869 NA
  // 1868,
  // 1867,
  // 1866,
  // 1865 NA
  // 1864 NA
  // 1863 NA
  // 1862,
  // 1861,
  // 1860 NA
  // 1859 NA
  // 1858 NA
  // 1857 NA
  // 1856 NA
  // 1855 NA
  // 1854 NA
  // 1853 NA
  // 1852 NA
  // 1851,
  // 1850 NA
  // 1849 NA
  // 1848 NA
  // 1847,
  // 1846 NA
  // 1845 NA
  // 1844,
  // 1843 NA
  // 1842,
  // 1841,
  1840,
  // 1839,
  // 1838,
  // 1837,
  // 1836,
  // 1835,
  // 1834,
  // 1833,
  1832,
  1831,
  // 1830 NA
  // 1829 NA
  // 1828 NA
  // 1827 NA
  // 1826 NA
  // 1825 NA
  // 1824 NA
  // 1823,
  // 1822 NA
  // 1821,
  // 1820,
  // 1819 NA
  // 1818,
  // 1817 NA
  // 1816,
  // 1815,
  // 1814 NA
  // 1813,
  // 1812,
  // 1811,
  // 1810 NA
  1809,
  1808,
  // 1807 NA
  1806,
  // 1805,
  // 1804,
  // 1803 NA
  // 1802,
  // 1801 NA
  // 1800 NA
  1799,
  // 1798 NA
  // 1797 NA
  // 1796 NA
  // 1795 NA
  // 1794,
  // 1793,
  // 1792 NA
  // 1791 NA
  // 1790 NA
  // 1789 NA
  // 1789 NA
  // 1788 NA
  // 1787 NA
  // 1786 NA
  // 1785,
  // 1784 NA
  // 1783,
  // 1782,
  // 1781,
  // 1780,
  // 1779,
  // 1778 NA
  // 1777 NA
  // 1776 NA
  // 1775 NA
  // 1774 NA
  // 1773 NA
  // 1772 NA
  // 1771 NA
  // 1770,
  // 1769,
  // 1768,
  // 1767 NA
  // 1766 NA
  // 1765,
  // 1764 NA
  // 1763,
  // 1762,
  // 1761,
  // 1760 NA
  // 1759,
  // 1758,
  1757,
  // 1756 NA
  1755,
  // 1754,
  1753,
  // 1753,
  // 1752,
  // 1751,
  // 1750,
  // 1749 NA
  // 1748,
  // 1747 NA
  // 1746 NA
  // 1745 NA
  // 1744 NA
  // 1743 NA
  // 1742,
  // 1741,
  // 1740,
  // 1739,
  // 1738,
  // 1737 NA
  // 1736 NA
  // 1735,
  // 1734,
  // 1733 NA
  1732,
  // 1731,
  // 1730,
  // 1729 NA
  1728,
  // 1727,
  // 1726 NA
  // 1725 NA
  // 1724 NA
  // 1723,
  // 1722 NA
  // 1721 NA
  // 1720,
  // 1719,
  // 1718,
  // 1717 NA
  1716,
  // 1715,
  // 1714,
  // 1713 NA
  1712,
  // 1711,
  // 1710,
  // 1709 NA
  // 1708,
  // 1707,
  // 1706 NA
  // 1705 NA
  // 1704,
  1703,
  // 1702,
  // 1701,
  1700,
  // 1699,
  // 1698 NA
  // 1697,
  // 1696,
  1695,
  // 1694 NA
  // 1693 NA
  // 1692,
  // 1691,
  // 1690 NA
  // 1689 NA
  // 1688 NA
  // 1687 NA
  // 1686,
  // 1685,
  // 1684 NA
  // 1683 NA
  1682,
  // 1681,
  // 1680 NA
  // 1679,
  // 1678 NA
  // 1677 NA
  1676,
  1675,
  // 1674 NA
  1673,
  // 1672 NA
  // 1671,
  // 1670,
  // 1669 NA
  // 1668 NA
  // 1667 NA
  // 1666 NA
  // 1665 NA
  // 1664,
  1663,
  // 1662 NA
  // 1661 NA
  // 1660,
  // 1659 NA
  // 1658,
  // 1657 NA
  // 1656,
  // 1655 NA
  1654,
  // 1653,
  1652,
  // 1651 NA
  // 1650,
  1649,
  // 1648,
  // 1647,
  // 1646 NA
  // 1645,
  // 1644,
  1643,
  // 1642,
  1641,
  // 1640,
  // 1639,
  // 1638,
  // 1637 NA
  // 1636 NA
  // 1635 NA
  // 1634,
  // 1633 NA
  // 1632 NA
  // 1631 NA
  // 1630,
  // 1629,
  // 1628 NA
  // 1627 NA
  // 1626 NA
  // 1625 NA
  // 1624 NA
  // 1623 NA
  // 1622 NA
  // 1621 NA
  // 1620,
  // 1619,
  // 1618 NA
  // 1617 NA
  // 1616 NA
  // 1615 NA
  // 1614,
  // 1613 NA
  // 1612 NA
  // 1611 NA
  // 1610 NA
  // 1609 NA
  // 1608,
  // 1607,
  // 1606,
  // 1605,
  // 1604,
  1603,
  // 1602 NA
  // 1601 NA
  // 1600 NA
  // 1599 NA
  // 1598 NA
  // 1597 NA
  1596,
  // 1595 NA
  // 1594 NA
  // 1593 NA
  1592,
  // 1591,
  // 1590,
  // 1589,
  // 1588,
  // 1587 NA
  // 1586,
  // 1585,
  // 1584 NA
  // 1583 NA
  // 1582,
  // 1581,
  // 1580,
  // 1579 NA
  1578,
  // 1577,
  1576,
  // 1575 NA
  1574,
  // 1573 NA
  // 1572 NA
  1571,
  1570,
  1569,
  1568,
  1567,
  // 1566 NA
  // 1565,
  // 1564,
  // 1563,
  // 1562 NA
  // 1561 NA
  // 1560 NA
  // 1559,
  // 1558,
  1557,
  // 1556 NA
  // 1555 NA
  1554,
  1553,
  1552,
  1551,
  1550,
  // 1549,
  1548,
  // 1547,
  1546,
  // 1545 NA
  // 1544 NA
  // 1543 NA
  // 1542 NA
  // 1541 NA
  // 1540 NA
  // 1539 NA
  // 1538 NA
  // 1537 NA
  // 1536 NA
  // 1535,
  // 1534 NA
  // 1533,
  // 1532 NA
  // 1531 NA
  // 1530 NA
  // 1529 NA
  1528,
  // 1527 NA
  // 1526 NA
  // 1525 NA
  // 1524 NA
  // 1523 NA
  // 1522 NA
  1521,
  // 1520 NA
  // 1519 NA
  // 1518 NA
  // 1517 NA
  1516,
  // 1515 NA
  // 1514 NA
  1513,
  // 1512 NA
  1511,
  // 1510 NA
  // 1509 NA
  // 1508 NA
  // 1507 NA
  // 1506 NA
  // 1505 NA
  // 1504 NA
  // 1503 NA
  // 1502 NA
  // 1501 NA
  1500,
  1499,
  // 1498 NA
  // 1497 NA
  // 1496 NA
  // 1495 NA
  // 1494,
  // 1493 NA
  1492,
  1491,
  // 1490 NA
  // 1489 NA
  // 1488 NA
  // 1487 NA
  1486,
  // 1485 NA
  // 1484 NA
  // 1483 NA
  // 1482 NA
  // 1481 NA
  1480,
  1479,
  1478,
  // 1477,
  // 1476 NA
  // 1475 NA
  // 1474 NA
  // 1473 NA
  // 1472 NA
  // 1471 NA
  // 1470 NA
  // 1469 NA
  1468,
  // 1467 NA
  // 1466 NA
  // 1465 NA
  1464,
  // 1463 NA
  // 1462 NA
  // 1461 NA
  // 1460 NA
  // 1459 NA
  // 1458 NA
  // 1457 NA
  // 1456 NA
  // 1455 NA
  // 1454 NA
  // 1453 NA
  // 1452 NA
  // 1451 NA
  // 1450 NA
  // 1449 NA
  // 1448 NA
  // 1447 NA
  // 1446 NA
  // 1445 NA
  // 1444 NA
  // 1443 NA
  // 1442 NA
  // 1441 NA
  // 1440 NA
  // 1439 NA
  // 1438 NA
  // 1437 NA
  // 1436 NA
  // 1435 NA
  // 1434 NA
  // 1433 NA
  // 1432 NA
  // 1431 NA
  // 1430 NA
  // 1429 NA
  // 1428 NA
  // 1427 NA
  // 1426 NA
  1425,
  // 1424 NA
  // 1423 NA
  // 1422 NA
  // 1421 NA
  // 1420 NA
  // 1419 NA
  // 1418 NA
  // 1417 NA
  // 1416 NA
  // 1415 NA
  // 1414 NA
  // 1413 NA
  // 1412 NA
  // 1411 NA
  1410,
  // 1409 NA
  // 1408 NA
  // 1407 NA
  1406,
  1405,
  // 1404 NA
  // 1403 NA
  // 1402 NA
  1401,
  // 1400 NA
  // 1399 NA
  // 1398 NA
  1397,
  1396,
  // 1395 NA
  1394,
  // 1393 NA
  // 1392 NA
  // 1391 NA
  // 1390 NA
  // 1389 NA
  1388,
  // 1387 NA
  // 1386 NA
  // 1385 NA
  1384,
  // 1383 NA
  // 1382 NA
  // 1381 NA
  // 1380 NA
  // 1379 NA
  // 1378 NA
  // 1377 NA
  // 1376 NA
  // 1375 NA
  // 1374 NA
  // 1373 NA
  // 1372 NA
  // 1371 NA
  // 1370 NA
  // 1369 NA
  // 1368 NA
  // 1367 NA
  1366,
  1365,
  // 1364 NA
  // 1363 NA
  // 1362 NA
  // 1361 NA
  // 1360 NA
  // 1359 NA
  // 1358 NA
  // 1357 NA
  // 1356 NA
  // 1355 NA
  // 1354 NA
  // 1353 NA
  1352,
  // 1351 NA
  // 1350 NA
  // 1349 NA
  // 1348 NA
  1347,
  1346,
  // 1345 NA
  // 1344 NA
  // 1343 NA
  // 1342 NA
  // 1341 NA
  // 1340 NA
  // 1339 NA
  // 1338 NA
  // 1337 NA
  // 1336 NA
  // 1335 NA
  // 1334 NA
  // 1333 NA
  // 1332 NA
  // 1331 NA
  // 1330 NA
  // 1329 NA
  // 1328 NA
  // 1327 NA
  // 1326 NA
  // 1325 NA
  // 1324 NA
  // 1323 NA
  // 1322 NA
  // 1321 NA
  // 1320 NA
  // 1319 NA
  // 1318 NA
  // 1317 NA
  // 1316 NA
  // 1315 NA
  // 1314 NA
  // 1313 NA
  // 1312 NA
  // 1311 NA
  // 1310 NA
  1309,
  // 1308 NA
  // 1307 NA
  // 1306 NA
  1305,
  1304,
  // 1303 NA
  // 1302 NA
  // 1301 NA
  // 1300 NA
  // 1299 NA
  // 1298 NA
  // 1297 NA
  1296,
  // 1295 NA
  // 1294 NA
  // 1293 NA
  1292,
  // 1291 NA
  // 1290 NA
  // 1289 NA
  // 1288 NA
  // 1287 NA
  // 1286 NA
  1285,
  1284,
  // 1283 NA
  1282,
  1281,
  // 1280 NA
  // 1279 NA
  // 1278 NA
  // 1277 NA
  1276,
  // 1275 NA
  // 1274 NA
  // 1273 NA
  // 1272 NA
  1271,
  // 1270 NA
  1269,
  // 1268 NA
  1267,
  // 1266
  // 1265 NA
  // 1264 NA
  // 1263 NA
  // 1262 NA
  // 1261 NA
  // 1260 NA
  1259,
  // 1258 NA
  // 1257 NA
  // 1256 NA
  // 1255 NA
  // 1254 NA
  // 1253 NA
  // 1252 NA
  // 1251 NA
  // 1250 NA
  // 1249 NA
  // 1248 NA
  // 1247 NA
  // 1246 NA
  // 1245 NA
  // 1244 NA
  // 1243 NA
  // 1242 NA
  // 1241 NA
  // 1240 NA
  // 1239 NA
  // 1238 NA
  1237,
  1236,
  // 1235 NA
  // 1234 NA
  // 1233 NA
  // 1232 NA
  // 1231 NA
  // 1230 NA
  // 1229 NA
  1228,
  // 1227 NA
  // 1226 NA
  // 1225 NA
  // 1224 NA
  1223,
  // 1222 NA
  // 1221 NA
  // 1220 NA
  // 1219 NA
  // 1218 NA
  // 1217 NA
  // 1216 NA
  // 1215 NA
  // 1214 NA
  // 1213 NA
  // 1212 NA
  // 1211 NA
  // 1210 NA
  // 1209 NA
  // 1208 NA
  // 1207 NA
  // 1206 NA
  // 1205 NA
  // 1204 NA
  // 1203 NA
  // 1202 NA
  // 1201 NA
  // 1200 NA
  // 1199 NA
  // 1198 NA
  // 1197 NA
  // 1196 NA
  // 1195 NA
  // 1194 NA
  // 1193 NA
  // 1192 NA
  // 1191 NA
  // 1190 NA
  // 1189 NA
  // 1188 NA
  // 1187 NA
  // 1186 NA
  // 1185 NA
  // 1184 NA
  // 1183 NA
  // 1182 NA
  1181,
  1180,
  1179,
  1178,
  // 1177 NA
  // 1176 NA
  // 1175 NA
  // 1174 NA
  1173,
  // 1172 NA
  // 1171 NA
  // 1170 NA
  // 1169 NA
  1168,
  1167,
  1166,
  // 1165 NA
  1164,
  1163,
  // 1162 NA
  1161,
  1160,
  // 1159 NA
  // 1158 NA
  1157,
  // 1156 NA
  // 1155 NA
  // 1154 NA
  1153,
  // 1152 NA
  1151,
  1150,
  1149,
  // 1148 NA
  1147,
  // 1146 NA
  // 1145 NA
  1144,
  1143,
  1142,
  1141,
  1140,
  // 1139 NA
  // 1138 NA
  1137,
  1136,
  // 1135 NA
  // 1134 NA
  // 1133 NA
  1132,
  // 1131 NA
  // 1130 NA
  // 1129 NA
  // 1128 NA
  // 1127 NA
  1126,
  // 1125 NA
  // 1124 NA
  1123,
  // 1122 NA
  1121,
  1120,
  1119,
  1118,
  1117,
  1116,
  // 1115 NA
  1114,
  1113,
  1112,
  1111,
  1110,
  // 1109 NA
  1108,
  1107,
  // 1106 NA
  1105,
  // 1104 NA
  // 1103 NA
  1102,
  1101,
  // 1100 NA
  // 1099 NA
  // 1098 NA
  // 1097 NA
  1096,
  // 1095 NA
  1094,
  1093,
  1092,
  1091,
  1090,
  1089,
  1088,
  1087,
  1086,
  1085,
  1084,
  // 1083 NA
  // 1082 NA
  1081,
  // 1080 NA
  // 1079 NA
  // 1078 NA
  // 1077 NA
  1076,
  1075,
  // 1074 NA
  // 1073 NA
  1072,
  1071,
  // 1070 NA
  // 1069 NA
  1068,
  // 1067 NA
  // 1066 NA
  1065,
  1064,
  // 1063 NA
  // 1062 NA
  1061,
  // 1060 NA
  1059,
  // 1058 NA
  1057,
  1056,
  1055,
  1054,
  1053,
  1052,
  1051,
  1050,
  1049,
  1048,
  1047,
  1046,
  // 1045 NA
  // 1044 NA
  // 1043 NA
  1042,
  1041,
  // 1040 NA
  // 1039 NA
  // 1038 NA
  1037,
  1036,
  1035,
  1034,
  // 1033 NA
  1032,
  // 1031 NA
  1030,
  1029,
  // 1028 NA
  1027,
  // 1026 NA
  // 1025 NA
  // 1024 NA
  // 1023 NA
  // 1022 NA
  // 1021 NA
  // 1020 NA
  // 1019 NA
  1018,
  1017,
  // 1016 NA
  1015,
  // 1014 NA
  1013,
  // 1012 NA
  // 1011 NA
  // 1010 NA
  // 1009 NA
  // 1008 NA
  1007,
  1006,
  // 1005 NA
  // 1004 NA
  // 1003 NA
  // 1002 NA
  1001,
  1000,
  // 999 NA
  998,
  // 997 NA
  // 996 NA
  // 995 NA
  // 994 NA
  // 993 NA
  // 992 NA
  991,
  // 990 NA
  989,
  // 988 NA
  // 987 NA
  // 986 NA
  // 985 NA
  984,
  // 983 NA
  // 982 NA
  981,
  980,
  // 979 NA
  978,
  977,
  // 976 NA
  975,
  974,
  973,
  972,
  // 971 NA
  // 970 NA
  // 969 NA
  // 968 NA
  // 967 NA
  // 966 NA
  // 965 NA
  // 964 NA
  963,
  // 962 NA
  961,
  // 960 NA
  // 959 NA
  958,
  957,
  // 956 NA
  955,
  // 954 NA
  953,
  952,
  951,
  950,
  949,
  // 948 NA
  // 947 NA
  946,
  945,
  944,
  // 943 NA
  942,
  941,
  // 940 NA
  939,
  // 938 NA
  937,
  936,
  // 935 NA
  // 934 NA
  933,
  932,
  // 931 NA
  // 930 NA
  929,
  // 928 NA
  // 927 NA
  926,
  925,
  // 924 NA
  // 923 NA
  922,
  // 921 NA
  // 920 NA
  // 919 NA
  // 918 NA
  // 917 NA
  916,
  915,
  // 914 NA
  // 913 NA
  912,
  // 911 NA
  // 910 NA
  // 909 NA
  // 908 NA
  // 907 NA
  // 906 NA
  // 905 NA
  // 904 NA
  903,
  // 902 NA
  901,
  // 900 NA
  // 899 NA
  898,
  // 897 NA
  896,
  895,
  // 894 NA
  893,
  // 892 NA
  891,
  // 890 NA
  889,
  888,
  887,
  // 886 NA
  885,
  // 884 NA
  883,
  882,
  881,
  // 880 NA
  879,
  878,
  877,
  // 876 NA
  // 875 NA
  // 874 NA
  // 873 NA
  // 872 NA
  871,
  870,
  // 869 NA
  868,
  // 867 NA
  // 866 NA
  // 865 NA
  // 864 NA
  // 863 NA
  // 862 NA
  // 861 NA
  // 860 NA
  859,
  858,
  857,
  856,
  // 855 NA
  // 854 NA
  853,
  // 852 NA
  // 851 NA
  // 850 NA
  849,
  848,
  847,
  // 846 NA
  845,
  844,
  843,
  // 842 NA
  // 841 NA
  // 840 NA
  // 839 NA
  // 838 NA
  // 837 NA
  836,
  835,
  834,
  833,
  832,
  831,
  830,
  // 829 NA
  828,
  // 827 NA
  826,
  825,
  // 824 NA
  823,
  822,
  // 821 NA
  820,
  819,
  818,
  817,
  816,
  815,
  814,
  813,
  // 812 NA
  811,
  810,
  809,
  // 808 NA
  807,
  806,
  805,
  // 804 NA
  803,
  802,
  801,
  800,
  799,
  798,
  // 797 NA
  // 796 NA
  795,
  // 794 NA
  793,
  792,
  791,
  790,
  789,
  // 788 NA
  787,
  786,
  785,
  784,
  // 783 NA
  782,
  781,
  780,
  779,
  778,
  // 777 NA
  776,
  775,
  774,
  773,
  // 772 NA
  771,
  // 770 NA
  769,
  768,
  // 767 NA
  // 766 NA
  765,
  764,
  // 763 NA
  // 762 NA
  // 761 NA
  760,
  // 759 NA
  758,
  // 757 NA
  // 756 NA
  755,
  754,
  753,
  // 752 NA
  // 751 NA
  // 750 NA
  749,
  748,
  747,
  746,
  745,
  // 744 NA
  743,
  742,
  741,
  740,
  739,
  // 738 NA
  737,
  736,
  // 735 NA
  734,
  // 733 NA
  732,
  // 731 NA
  // 730 NA
  729,
  // 728 NA
  // 727 NA
  // 726 NA
  // 725 NA
  // 724 NA
  723,
  722,
  721,
  // 720 NA
  719,
  718,
  717,
  716,
  715,
  714,
  713,
  712,
  711,
  710,
  709,
  708,
  707,
  706,
  // 705 NA
  704,
  // 703 NA
  702,
  // 701 NA
  700,
  699,
  698,
  697,
  696,
  695,
  694,
  693,
  // 692 NA
  // 691 NA
  690,
  689,
  688,
  // 687 NA
  686,
  685,
  // 684 NA
  // 683 NA
  682,
  // 681 NA
  680,
  // 679 NA
  // 678 NA
  // 677 NA
  // 676 NA
  675,
  // 674 NA
  673,
  672,
  671,
  670,
  // 669 NA
  668,
  667,
  // 666 NA
  665,
  // 664 NA
  // 663 NA
  662,
  // 661 NA
  660,
  659,
  658,
  // 657 NA
  656,
  655,
  654,
  653,
  // 652 NA
  651,
  // 650 NA
  649,
  // 648 NA
  // 647 NA
  646,
  645,
  // 644 NA
  643,
  642,
  // 641 NA
  640,
  639,
  // 638 NA
  637,
  636,
  635,
  634,
  633,
  // 632 NA
  631,
  630,
  629,
  // 628 NA
  // 627 NA
  // 626 NA
  // 625 NA
  // 624 NA
  623,
  // 622 NA
  // 621 NA
  // 620 NA
  // 619 NA
  // 618 NA
  617,
  616,
  615,
  614,
  613,
  612,
  // 611 NA
  // 610 NA
  609,
  608,
  // 607 NA
  606,
  605,
  604,
  603,
  602,
  601,
  600,
  599,
  598,
  597,
  // 596 NA
  595,
  594,
  593,
  // 592 NA
  // 591 NA
  590,
  // 589 NA
  588,
  587,
  // 586 NA
  585,
  // 584 NA
  // 583 NA
  582,
  // 581 NA
  580,
  579,
  578,
  577,
  576,
  575,
  574,
  573,
  572,
  // 571 NA
  // 570 NA
  569,
  568,
  567,
  566,
  565,
  // 564 NA
  563,
  562,
  561,
  // 560 NA
  559,
  // 558 NA
  // 557 NA
  // 556 NA
  // 555 NA
  554,
  553,
  552,
  551,
  550,
  549,
  // 548 NA
  547,
  546,
  545,
  // 544 NA
  543,
  542,
  541,
  // 540 NA
  539,
  538,
  537,
  536,
  535,
  // 534 NA
  533,
  532,
  531,
  530,
  529,
  528,
  527,
  526,
  525,
  524,
  // 523 NA
  // 522 NA
  521,
  520,
  519,
  518,
  517,
  516,
  515,
  514,
  513,
  // 512 NA
  // 511 NA
  // 510 NA
  // 509 NA
  508,
  // 507 NA
  // 506 NA
  // 505 NA
  // 504 NA
  503,
  502,
  // 501 NA
  500,
  499,
  // 498 NA
  497,
  // 496 NA
  // 495 NA
  494,
  493,
  492,
  491,
  490,
  489,
  488,
  487,
  486,
  485,
  // 484 NA
  483,
  // 482 NA
  // 481 NA
  // 480 NA
  // 479 NA
  478,
  477,
  // 476 NA
  // 475 NA
  474,
  473,
  472,
  // 471 NA
  470,
  // 469 NA
  468,
  467,
  466,
  // 465 NA
  // 464 NA
  463,
  462,
  // 461 NA
  // 460 NA
  // 459 NA
  458,
  457,
  456,
  455,
  454,
  // 453 NA
  452,
  // 451 NA
  450,
  449,
  // 448 NA
  447,
  446,
  445,
  444,
  // 443 NA
  442,
  441,
  440,
  439,
  438,
  437,
  436,
  435,
  434,
  433,
  // 432 NA
  // 431 NA
  // 430 NA
  // 429 NA
  // 428 NA
  427,
  // 426 NA
  425,
  // 424 NA
  423,
  422,
  421,
  // 420 NA
  419,
  418,
  417,
  416,
  415,
  414,
  // 413 NA
  // 412 NA
  411,
  410,
  // 409 NA
  408,
  407,
  406,
  405,
  // 404 NA
  // 403 NA
  // 402 NA
  // 401 NA
  // 400 NA
  // 399 NA
  // 398 NA
  397,
  396,
  395,
  // 394 NA
  // 393 NA
  392,
  391,
  390,
  389,
  388,
  387,
  386,
  // 385 NA
  // 384 NA
  383,
  382,
  381,
  // 380 NA
  379,
  378,
  377,
  376,
  375,
  374,
  373,
  372,
  371,
  370,
  369,
  368,
  367,
  // 366 NA
  365,
  364,
  // 363 NA
  362,
  361,
  360,
  359,
  358,
  357,
  // 356 NA
  355,
  // 354 NA
  353,
  352,
  351,
  350,
  349,
  348,
  347,
  346,
  345,
  344,
  343,
  // 342 NA
  341,
  // 340 NA
  339,
  338,
  337,
  336,
  335,
  334,
  // 333 NA
  // 332 NA
  331,
  330,
  329,
  328,
  327,
  // 326 NA
  325,
  324,
  323,
  // 322 NA
  // 321 NA
  320,
  // 319 NA
  318,
  317,
  // 316 NA
  315,
  314,
  313,
  312,
  311,
  310,
  309,
  308,
  // 307 NA
  306,
  305,
  // 304 NA
  303,
  302,
  301,
  // 300 NA
  // 299 NA
  298,
  297,
  296,
  295,
  294,
  293,
  292,
  291,
  290,
  289,
  288,
  // 287 NA
  286,
  285,
  284,
  // 283 NA
  282,
  281,
  280,
  279,
  278,
  277,
  276,
  275,
  274,
  // 273 NA
  272,
  // 271 NA
  // 270 NA
  269,
  268,
  267,
  266,
  265,
  264,
  // 263 NA
  262,
  261,
  260,
  // 259 NA
  // 258 NA
  // 257 NA
  256,
  // 255 NA
  // 254 NA
  253,
  // 252 NA
  251,
  // 250 NA
  249,
  248,
  247,
  // 246 NA
  245,
  // 244 NA
  243,
  242,
  241,
  240,
  239,
  // 238 NA
  237,
  236,
  235,
  234,
  233,
  232,
  231,
  230,
  229,
  // 228 NA
  // 227 NA
  226,
  // 225 NA
  // 224 NA
  // 223 NA
  // 222 NA
  221,
  220,
  219,
  218,
  // 217 NA
  // 216 NA
  215,
  // 214 NA
  213,
  // 212 NA
  211,
  210,
  209,
  // 208 NA
  207,
  // 206 NA
  205,
  204,
  203,
  // 202 NA
  201,
  // 200 NA
  199,
  // 198 NA
  // 197 NA
  // 196 NA
  // 195 NA
  // 194 NA
  193,
  192,
  191,
  // 190 NA
  // 189 NA
  // 188 NA
  187,
  186,
  // 185 NA
  184,
  // 183 NA
  // 182 NA
  181,
  // 180 NA
  // 179 NA
  178,
  // 177 NA
  // 176 NA
  // 175 NA
  // 174 NA
  173,
  172,
  171,
  170,
  169,
  // 168 NA
  167,
  166,
  165,
  // 164 NA
  // 163 NA
  // 162 NA
  // 161 NA
  160,
  159,
  158,
  157,
  156,
  155,
  154,
  153,
  152,
  151,
  150,
  149,
  148,
  147,
  146,
  145,
  144,
  143,
  142,
  141,
  140,
  139,
  138,
  137,
  136,
  135,
  134,
  133,
  132,
  131,
  130,
  129,
  128,
  127,
  126,
  125,
  124,
  123,
  122,
  121,
  120,
  119,
  118,
  117,
  116,
  115,
  114,
  113,
  112,
  111,
  110,
  109,
  108,
  107,
  106,
  105,
  104,
  103,
  102,
  101,
  100,
  99,
  98,
  97,
  96,
  95,
  94,
  93,
  92,
  91,
  90,
  89,
  88,
  87,
  86,
  85,
  84,
  83,
  82,
  81,
  80,
  79,
  78,
  77,
  76,
  75,
  74,
  73,
  72,
  71,
  70,
  69,
  68,
  67,
  66,
  65,
  64,
  63,
  62,
  61,
  60,
  59,
  58,
  57,
  56,
  55,
  54,
  53,
  52,
  51,
  50,
  49,
  48,
  47,
  46,
  45,
  44,
  43,
  42,
  41,
  40,
  39,
  38,
  37,
  36,
  35,
  34,
  33,
  32,
  31,
  30,
  29,
  28,
  27,
  26,
  25,
  24,
  23,
  22,
  21,
  20,
  19,
  18,
  17,
  16,
  15,
  14,
  13,
  12,
  11,
  10,
  9,
  8,
  7,
  6,
  5,
  4,
  3,
  2,
  1,
  0
};
// clang-format on

/// Place to put a short description when adding a feature with a patch.
/// Keep it short, e.g.,: "relative numbers", "persistent undo".
/// Also add a comment marker to separate the lines.
/// See the official Vim patches for the diff format: It must use a context of
/// one line only.  Create it by hand or use "diff -C2" and edit the patch.
static char *(extra_patches[]) = {
  // Add your patch description below this line
  NULL
};

/// Checks whether patch `n` has been included.
///
/// @param n The patch number.
///
/// @return TRUE if patch "n" has been included.
int has_patch(int n)
{
  int i;
  for (i = 0; included_patches[i] != 0; ++i) {
    if (included_patches[i] == n) {
      return TRUE;
    }
  }
  return FALSE;
}

void ex_version(exarg_T *eap)
{
  // Ignore a ":version 9.99" command.
  if (*eap->arg == NUL) {
    msg_putchar('\n');
    list_version();
  }
}

/// List all features aligned in columns, dictionary style.
static void list_features(void)
{
  int nfeat = 0;
  int width = 0;

  // Find the length of the longest feature name, use that + 1 as the column
  // width
  int i;
  for (i = 0; features[i] != NULL; ++i) {
    int l = (int)STRLEN(features[i]);

    if (l > width) {
      width = l;
    }
    nfeat++;
  }
  width += 1;

  if (Columns < width) {
    // Not enough screen columns - show one per line
    for (i = 0; features[i] != NULL; ++i) {
      version_msg(features[i]);
      if (msg_col > 0) {
        msg_putchar('\n');
      }
    }
    return;
  }

  // The rightmost column doesn't need a separator.
  // Sacrifice it to fit in one more column if possible.
  int ncol = (int)(Columns + 1) / width;
  int nrow = nfeat / ncol + (nfeat % ncol ? 1 : 0);

  // i counts columns then rows.  idx counts rows then columns.
  for (i = 0; !got_int && i < nrow * ncol; ++i) {
    int idx = (i / ncol) + (i % ncol) * nrow;
    if (idx < nfeat) {
      int last_col = (i + 1) % ncol == 0;
      msg_puts((char_u *)features[idx]);
      if (last_col) {
        if (msg_col > 0) {
          msg_putchar('\n');
        }
      } else {
        while (msg_col % width) {
          msg_putchar(' ');
        }
      }
    } else {
      if (msg_col > 0) {
        msg_putchar('\n');
      }
    }
  }
  MSG_PUTS("For differences from Vim, see :help vim-differences\n\n");
}

void list_version(void)
{
  // When adding features here, don't forget to update the list of
  // internal variables in eval.c!
  MSG(longVersion);
  MSG(version_buildtype);
  MSG(version_cflags);

  // Print the list of extra patch descriptions if there is at least one.
  char *s = "";
  if (extra_patches[0] != NULL) {
    MSG_PUTS(_("\nExtra patches: "));
    s = "";

    for (int i = 0; extra_patches[i] != NULL; ++i) {
      MSG_PUTS(s);
      s = ", ";
      MSG_PUTS(extra_patches[i]);
    }
  }

#ifdef HAVE_PATHDEF

  if ((*compiled_user != NUL) || (*compiled_sys != NUL)) {
    MSG_PUTS(_("\nCompiled "));

    if (*compiled_user != NUL) {
      MSG_PUTS(_("by "));
      MSG_PUTS(compiled_user);
    }

    if (*compiled_sys != NUL) {
      MSG_PUTS("@");
      MSG_PUTS(compiled_sys);
    }
  }
#endif  // ifdef HAVE_PATHDEF

  version_msg(_("\n\nOptional features included (+) or not (-): "));

  list_features();

#ifdef SYS_VIMRC_FILE
  version_msg(_("   system vimrc file: \""));
  version_msg(SYS_VIMRC_FILE);
  version_msg("\"\n");
#endif  // ifdef SYS_VIMRC_FILE
#ifdef HAVE_PATHDEF

  if (*default_vim_dir != NUL) {
    version_msg(_("  fall-back for $VIM: \""));
    version_msg(default_vim_dir);
    version_msg("\"\n");
  }

  if (*default_vimruntime_dir != NUL) {
    version_msg(_(" f-b for $VIMRUNTIME: \""));
    version_msg(default_vimruntime_dir);
    version_msg("\"\n");
  }
#endif  // ifdef HAVE_PATHDEF
}

/// Output a string for the version message.  If it's going to wrap, output a
/// newline, unless the message is too long to fit on the screen anyway.
///
/// @param s
static void version_msg(char *s)
{
  int len = (int)STRLEN(s);

  if (!got_int
      && (len < (int)Columns)
      && (msg_col + len >= (int)Columns)
      && (*s != '\n')) {
    msg_putchar('\n');
  }

  if (!got_int) {
    MSG_PUTS(s);
  }
}


/// Show the intro message when not editing a file.
void maybe_intro_message(void)
{
  if (bufempty()
      && (curbuf->b_fname == NULL)
      && (firstwin->w_next == NULL)
      && (vim_strchr(p_shm, SHM_INTRO) == NULL)) {
    intro_message(FALSE);
  }
}

/// Give an introductory message about Vim.
/// Only used when starting Vim on an empty file, without a file name.
/// Or with the ":intro" command (for Sven :-).
///
/// @param colon TRUE for ":intro"
void intro_message(int colon)
{
  int i;
  long row;
  long blanklines;
  int sponsor;
  char *p;
  static char *(lines[]) = {
    N_(NVIM_VERSION_LONG),
    "",
    N_("by Bram Moolenaar et al."),
    N_("Vim is open source and freely distributable"),
    "",
    N_("Type \":Tutor\" or \":help nvim\" to get started!"),
    "",
    N_("Still have questions? https://neovim.io/community"),
    "",
    N_("type  :q<Enter>               to exit         "),
    N_("type  :help<Enter>  or  <F1>  for on-line help"),
    "",
    N_("Help poor children in Uganda!"),
    N_("type  :help iccf<Enter>       for information "),
  };

  // blanklines = screen height - # message lines
  size_t lines_size = ARRAY_SIZE(lines);
  assert(lines_size <= LONG_MAX);

  blanklines = Rows - ((long)lines_size - 1l);

  // Don't overwrite a statusline.  Depends on 'cmdheight'.
  if (p_ls > 1) {
    blanklines -= Rows - topframe->fr_height;
  }

  if (blanklines < 0) {
    blanklines = 0;
  }

  // Show the sponsor and register message one out of four times, the Uganda
  // message two out of four times.
  sponsor = (int)time(NULL);
  sponsor = ((sponsor & 2) == 0) - ((sponsor & 4) == 0);

  // start displaying the message lines after half of the blank lines
  row = blanklines / 2;

  if (((row >= 2) && (Columns >= 50)) || colon) {
    for (i = 0; i < (int)ARRAY_SIZE(lines); ++i) {
      p = lines[i];

      if (sponsor != 0) {
        if (strstr(p, "children") != NULL) {
          p = sponsor < 0
              ? N_("Sponsor Vim development!")
              : N_("Become a registered Vim user!");
        } else if (strstr(p, "iccf") != NULL) {
          p = sponsor < 0
              ? N_("type  :help sponsor<Enter>    for information ")
              : N_("type  :help register<Enter>   for information ");
        } else if (strstr(p, "Orphans") != NULL) {
          p = N_("menu  Help->Sponsor/Register  for information    ");
        }
      }

      if (*p != NUL) {
        do_intro_line(row, (char_u *)_(p), 0);
      }
      row++;
    }
  }

  // Make the wait-return message appear just below the text.
  if (colon) {
    assert(row <= INT_MAX);
    msg_row = (int)row;
  }
}

static void do_intro_line(long row, char_u *mesg, int attr)
{
  long col;
  char_u *p;
  int l;
  int clen;

  // Center the message horizontally.
  col = vim_strsize(mesg);

  col = (Columns - col) / 2;

  if (col < 0) {
    col = 0;
  }

  // Split up in parts to highlight <> items differently.
  for (p = mesg; *p != NUL; p += l) {
    clen = 0;

    for (l = 0; p[l] != NUL
         && (l == 0 || (p[l] != '<' && p[l - 1] != '>')); ++l) {
      if (has_mbyte) {
        clen += ptr2cells(p + l);
        l += (*mb_ptr2len)(p + l) - 1;
      } else {
        clen += byte2cells(p[l]);
      }
    }
    assert(row <= INT_MAX && col <= INT_MAX);
    screen_puts_len(p, l, (int)row, (int)col, *p == '<' ? hl_attr(HLF_8) : attr);
    col += clen;
  }
}

/// ":intro": clear screen, display intro screen and wait for return.
///
/// @param eap
void ex_intro(exarg_T *eap)
{
  screenclear();
  intro_message(TRUE);
  wait_return(TRUE);
}

